/**
 * @file 微信小程序JSAPI
 * @author 崔健 cuijian03@baidu.com 2017.01.10
 * @update 邓淑芳 623996689@qq.com 2019.07.03
 */

/**
 * 百度地图微信小程序API类
 *
 * @class
 */
class BMapWX {

	/**
	 * 百度地图微信小程序API类
	 *
	 * @constructor
	 */
	constructor(param) {
		this.ak = param["ak"];
	}

	/**
	 * 使用微信接口进行定位
	 *
	 * @param {string} type 坐标类型
	 * @param {Function} success 成功执行
	 * @param {Function} fail 失败执行
	 * @param {Function} complete 完成后执行
	 */
	getWXLocation(type, success, fail, complete) {
		type = type || 'gcj02',
			success = success || function() {};
		fail = fail || function() {};
		complete = complete || function() {};
		wx.getLocation({
			type: type,
			success: success,
			fail: fail,
			complete: complete
		});
	}

	/**
	 * POI周边检索
	 *
	 * @param {Object} param 检索配置
	 * 参数对象结构可以参考
	 * http://lbsyun.baidu.com/index.php?title=webapi/guide/webservice-placeapi
	 */
	search(param) {
		var that = this;
		param = param || {};
		let searchparam = {
			query: param["query"] || '生活服务$美食&酒店',
			scope: param["scope"] || 1,
			filter: param["filter"] || '',
			coord_type: param["coord_type"] || 2,
			page_size: param["page_size"] || 10,
			page_num: param["page_num"] || 0,
			output: param["output"] || 'json',
			ak: that.ak,
			sn: param["sn"] || '',
			timestamp: param["timestamp"] || '',
			radius: param["radius"] || 2000,
			ret_coordtype: 'gcj02ll'
		};
		let otherparam = {
			iconPath: param["iconPath"],
			iconTapPath: param["iconTapPath"],
			width: param["width"],
			height: param["height"],
			alpha: param["alpha"] || 1,
			success: param["success"] || function() {},
			fail: param["fail"] || function() {}
		};
		let type = 'gcj02';
		let locationsuccess = function(result) {
			searchparam["location"] = result["latitude"] + ',' + result["longitude"];
			wx.request({
				url: 'https://api.map.baidu.com/place/v2/search',
				data: searchparam,
				header: {
					"content-type": "application/json"
				},
				method: 'GET',
				success(data) {
					let res = data["data"];
					if (res["status"] === 0) {
						let poiArr = res["results"];
						// outputRes 包含两个对象，
						// originalData为百度接口返回的原始数据
						// wxMarkerData为小程序规范的marker格式
						let outputRes = {};
						outputRes["originalData"] = res;
						outputRes["wxMarkerData"] = [];
						for (let i = 0; i < poiArr.length; i++) {
							outputRes["wxMarkerData"][i] = {
								id: i,
								latitude: poiArr[i]["location"]["lat"],
								longitude: poiArr[i]["location"]["lng"],
								title: poiArr[i]["name"],
								iconPath: otherparam["iconPath"],
								iconTapPath: otherparam["iconTapPath"],
								address: poiArr[i]["address"],
								telephone: poiArr[i]["telephone"],
								alpha: otherparam["alpha"],
								width: otherparam["width"],
								height: otherparam["height"]
							}
						}
						otherparam.success(outputRes);
					} else {
						otherparam.fail({
							errMsg: res["message"],
							statusCode: res["status"]
						});
					}
				},
				fail(data) {
					otherparam.fail(data);
				}
			});
		}
		let locationfail = function(result) {
			otherparam.fail(result);
		};
		let locationcomplete = function(result) {};
		if (!param["location"]) {
			that.getWXLocation(type, locationsuccess, locationfail, locationcomplete);
		} else {
			let longitude = param.location.split(',')[1];
			let latitude = param.location.split(',')[0];
			let errMsg = 'input location';
			let res = {
				errMsg: errMsg,
				latitude: latitude,
				longitude: longitude
			};
			locationsuccess(res);
		}
	}

	/**
	 * sug模糊检索
	 *
	 * @param {Object} param 检索配置
	 * 参数对象结构可以参考
	 * http://lbsyun.baidu.com/index.php?title=webapi/place-suggestion-api
	 */
	suggestion(param) {
		var that = this;
		param = param || {};
		let suggestionparam = {
			query: param["query"] || '',
			region: param["region"] || '全国',
			city_limit: param["city_limit"] || false,
			output: param["output"] || 'json',
			ak: that.ak,
			sn: param["sn"] || '',
			timestamp: param["timestamp"] || '',
			ret_coordtype: 'gcj02ll'
		};
		let otherparam = {
			success: param["success"] || function() {},
			fail: param["fail"] || function() {}
		};
		wx.request({
			url: 'https://api.map.baidu.com/place/v2/suggestion',
			data: suggestionparam,
			header: {
				"content-type": "application/json"
			},
			method: 'GET',
			success(data) {
				let res = data["data"];
				if (res["status"] === 0) {
					otherparam.success(res);
				} else {
					otherparam.fail({
						errMsg: res["message"],
						statusCode: res["status"]
					});
				}
			},
			fail(data) {
				otherparam.fail(data);
			}
		});
	}

	/**
	 * rgc检索（逆地理编码：经纬度->地点描述）
	 * 
	 * @param {Object} param 检索配置
	 * 参数对象结构可以参考
	 * https://lbs.baidu.com/index.php?title=webapi/guide/webservice-geocoding-abroad
	 * 
	 */
	regeocoding(param) {
		var that = this;
		param = param || {};
		let regeocodingparam = {
			coordtype: param["coordtype"] || 'gcj02ll',
			ret_coordtype: 'gcj02ll',
			radius: param["radius"] || 1000,
			ak: that.ak,
			sn: param["sn"] || '',
			output: param["output"] || 'json',
			callback: param["callback"] || function() {},
			extensions_poi: param["extensions_poi"] || 0,//extensions_poi=0，不召回pois数据。extensions_poi=1，返回pois数据，默认显示周边1000米内的poi。
			extensions_road: param["extensions_road"] || false,
			extensions_town: param["extensions_town"] || false,
			language: param["language"] || 'zh-CN',
			language_auto: param["language_auto"] || 0
		};
		let otherparam = {
			iconPath: param["iconPath"],
			iconTapPath: param["iconTapPath"],
			width: param["width"],
			height: param["height"],
			alpha: param["alpha"] || 1,
			success: param["success"] || function() {},
			fail: param["fail"] || function() {}
		};
		let type = 'gcj02';
		let locationsuccess = function(result) {
			regeocodingparam["location"] = result["latitude"] + ',' + result["longitude"];
			wx.request({
				url: 'https://api.map.baidu.com/reverse_geocoding/v3',
				data: regeocodingparam,
				header: {
					"content-type": "application/json"
				},
				method: 'GET',
				success(data) {
					let res = data["data"];
					if (res["status"] === 0) {
						let poiObj = res["result"];
						// outputRes 包含两个对象：
						// originalData为百度接口返回的原始数据
						// wxMarkerData为小程序规范的marker格式
						let outputRes = {};
						outputRes["originalData"] = res;
						outputRes["wxMarkerData"] = [];
						outputRes["wxMarkerData"][0] = {
							id: 0,
							latitude: result["latitude"],
							longitude: result["longitude"],
							address: poiObj["formatted_address"],
							iconPath: otherparam["iconPath"],
							iconTapPath: otherparam["iconTapPath"],
							desc: poiObj["sematic_description"],
							business: poiObj["business"],
							alpha: otherparam["alpha"],
							width: otherparam["width"],
							height: otherparam["height"]
						}
						otherparam.success(outputRes);
					} else {
						otherparam.fail({
							errMsg: res["message"],
							statusCode: res["status"]
						});
					}
				},
				fail(data) {
					otherparam.fail(data);
				}
			});
		};
		let locationfail = function(result) {
			otherparam.fail(result);
		}
		let locationcomplete = function(result) {};
		if (!param["location"]) {
			that.getWXLocation(type, locationsuccess, locationfail, locationcomplete);
		} else {
			let longitude = param.location.split(',')[1];
			let latitude = param.location.split(',')[0];
			let errMsg = 'input location';
			let res = {
				errMsg: errMsg,
				latitude: latitude,
				longitude: longitude
			};
			locationsuccess(res);
		}
	}

	/**
	 * gc检索（地理编码：地点->经纬度）
	 *
	 * @param {Object} param 检索配置
	 * 参数对象结构可以参考
	 * https://lbs.baidu.com/index.php?title=webapi/guide/webservice-geocoding
	 * 
	 */
	geocoding(param) {
		var that = this;
		param = param || {};
		let geocodingparam = {
			address: param["address"] || '',
			city: param["city"] || '',
			ret_coordtype: param["coordtype"] || 'gcj02ll',
			ak: that.ak,
			sn: param["sn"] || '',
			output: param["output"] || 'json',
			callback: param["callback"] || function() {}
		};
		let otherparam = {
			iconPath: param["iconPath"],
			iconTapPath: param["iconTapPath"],
			width: param["width"],
			height: param["height"],
			alpha: param["alpha"] || 1,
			success: param["success"] || function() {},
			fail: param["fail"] || function() {}
		};
		if (param["address"]) {
			wx.request({
				url: 'https://api.map.baidu.com/geocoding/v3',
				data: geocodingparam,
				header: {
					"content-type": "application/json"
				},
				method: 'GET',
				success(data) {
					let res = data["data"];
					if (res["status"] === 0) {
						let poiObj = res["result"];
						// outputRes 包含两个对象：
						// originalData为百度接口返回的原始数据
						// wxMarkerData为小程序规范的marker格式
						let outputRes = res;
						outputRes["originalData"] = res;
						outputRes["wxMarkerData"] = [];
						outputRes["wxMarkerData"][0] = {
							id: 0,
							latitude: poiObj["location"]["lat"],
							longitude: poiObj["location"]["lng"],
							iconPath: otherparam["iconPath"],
							iconTapPath: otherparam["iconTapPath"],
							alpha: otherparam["alpha"],
							width: otherparam["width"],
							height: otherparam["height"]
						}
						otherparam.success(outputRes);
					} else {
						otherparam.fail({
							errMsg: res["message"],
							statusCode: res["status"]
						});
					}
				},
				fail(data) {
					otherparam.fail(data);
				}
			});
		} else {
			let errMsg = 'input address!';
			let res = {
				errMsg: errMsg
			};
			otherparam.fail(res);
		}
	}

	/**
	 * 天气检索
	 *
	 * @param {Object} param 检索配置
	 */
	weather(param) {
		var that = this;
		param = param || {};
		let weatherparam = {
			coord_type: param["coord_type"] || 'gcj02',
			output: param["output"] || 'json',
			ak: that.ak,
			sn: param["sn"] || '',
			timestamp: param["timestamp"] || ''
		};
		let otherparam = {
			success: param["success"] || function() {},
			fail: param["fail"] || function() {}
		};
		let type = 'gcj02';
		let locationsuccess = function(result) {
			weatherparam["location"] = result["longitude"] + ',' + result["latitude"];
			wx.request({
				url: 'https://api.map.baidu.com/telematics/v3/weather',
				data: weatherparam,
				header: {
					"content-type": "application/json"
				},
				method: 'GET',
				success(data) {
					let res = data["data"];
					if (res["error"] === 0 && res["status"] === 'success') {
						let weatherArr = res["results"];
						// outputRes 包含两个对象，
						// originalData为百度接口返回的原始数据
						// wxMarkerData为小程序规范的marker格式
						let outputRes = {};
						outputRes["originalData"] = res;
						outputRes["currentWeather"] = [];
						outputRes["currentWeather"][0] = {
							currentCity: weatherArr[0]["currentCity"],
							pm25: weatherArr[0]["pm25"],
							date: weatherArr[0]["weather_data"][0]["date"],
							temperature: weatherArr[0]["weather_data"][0]["temperature"],
							weatherDesc: weatherArr[0]["weather_data"][0]["weather"],
							wind: weatherArr[0]["weather_data"][0]["wind"]
						};
						otherparam.success(outputRes);
					} else {
						otherparam.fail({
							errMsg: res["message"],
							statusCode: res["status"]
						});
					}
				},
				fail(data) {
					otherparam.fail(data);
				}
			});
		}
		let locationfail = function(result) {
			otherparam.fail(result);
		}
		let locationcomplete = function(result) {}
		if (!param["location"]) {
			that.getWXLocation(type, locationsuccess, locationfail, locationcomplete);
		} else {
			let longitude = param.location.split(',')[0];
			let latitude = param.location.split(',')[1];
			let errMsg = 'input location';
			let res = {
				errMsg: errMsg,
				latitude: latitude,
				longitude: longitude
			};
			locationsuccess(res);
		}
	}
}

module.exports.BMapWX = BMapWX;
